#ifndef MODBUS_DEV_DRIVER_H
#define MODBUS_DEV_DRIVER_H

#define MODBUS_DEVICE_REG_AMOUNT 120
#define MODBUS_DEVICE_AMOUNT 1

#define RECV_FRAME_MINI_LENGTH 0X04

/*功能指令码定义*/
typedef enum
{
	READ_COIL_STATUS = 0X01,
	READ_INPUT_STATUS = 0X02,
	READ_HOLD_REGISTERS = 0X03,
	READ_INPUT_REGISTERS = 0X04,

	FORCE_SINGLE_COIL = 0X05,
	PRESET_SINGLE_REGISTER = 0X06,
	READ_EXCEPTION_STATUS = 0X07,
	FETCH_COMM_EVENT_CTR = 0X0B,
	FETCH_COMM_EVENT_LOG = 0X0C,
	FORCE_MULTIPLE_COILS = 0X0F,
	PRESET_MULTIPLE_REGS = 0X10,
	REPORT_SLAVE_ID = 0X11,

	READ_GENERAL_REFERENCE = 0X14,
	WRITE_GENERAL_REFERENCE = 0X15,
	MASK_WRITE_4X_REGISTER = 0X16,
	READ_WRITE_4X_REGISTERS = 0X17,
	READ_FIFO_QUEUE = 0X18,	
}STRUCT_MODBUS_DEVICE_FUNCODE;

//////////////////////////////点表/////////////////////////////

///////////////////////////////迪控调光模块////////////////////////////
/*线圈*/
typedef enum
{
	ALL_OPEN_OR_CLOSE = 0X00,			//全开/关
	MODULE_SYSTEM_RESET = 0X01,			//复位
	RELOAD_DEFAULT_PARAM = 0X02,		//恢复预置参数	
	ILLUMINANCE_ENABLE	= 0x1c,			//光照度使能
	CALL_SCENARIO1 	= 0X1d,				//场景1
	CALL_SCENARIO2 	= 0X1e,				//场景2
	CALL_SCENARIO3 	= 0X1f,				//场景3
	CALL_SCENARIO4 	= 0X20,				//场景4
	CALL_SCENARIO5 	= 0X21,				//场景5
	CALL_SCENARIO6 	= 0X22,				//场景6
	
}STRUCT_INPUT_AND_COIL_STATUS_BITS_OFFSET;

/*寄存器*/
typedef enum
{
	ILLUMINANCE_CORRECTION = 0X02,		//光照度校正值
	ILLUMINANCE_SETTING = 0X04,			//光照度设定值
	ILLUMINANCE_MEASURED = 0X05,		//光照度实际值
	RTC_CLOCK_LO	= 0x1b,				//rtc时钟低16位
	RTC_CLOCK_HI 	= 0X1c,				//rtc 时钟高16位
	DIMING_VALUES_1 = 0X34, 			//调光1value
	DIMING_VALUES_2 = 0X35, 			//调光2value	
	DIMING_VALUES_3 = 0X36, 			//调光3value
	DIMING_VALUES_4 = 0X37, 			//调光4value
}STRUCT_INPUT_AND_HOLD_DATA_REG_OFFSET_01;	
	
/////////////////////////////////////////////end////////////////////////////////////////

///////////////////////////////////////////////时俱调光模块//////////////////////////////////////
/*寄存器地址偏移*/
typedef enum
{

	SLAVE_DEVICE_ADDRESS = 0X00,	//从设备地址
	FIRST_COIL_ADDRESS = 0X01,		//第1继电器地址
	SECONE_COIL_ADDRESS = 0X02,		//第2继电器地址
	THIRD_COIL_ADDRESS = 0X03,		//第3继电器地址
	FOURTH_COIL_ADDRESS = 0X04,		//第4继电器地址
	FIVTH_COIL_ADDRESS = 0X05,		//第5继电器地址
	SIXTH_COIL_ADDRESS = 0X06,		//第6继电器地址
	SEVENTH_COIL_ADDRESS = 0X07,		//第7继电器地址
	EIGHTH_COIL_ADDRESS = 0X08,		//第8继电器地址
	NINTH_COIL_ADDRESS = 0X09,		//第9继电器地址
	TENTH_COIL_ADDRESS = 0X0A,		//第10继电器地址
	ELEVENTH_COIL_ADDRESS = 0X0B,		//第11继电器地址
	TWELFTH_COIL_ADDRESS = 0X0C,		//第12继电器地址

	FIRST_TWELFTH_COIL_STATES = 0X0D,	//1-12 继电器状态
	
	FIRST_DIMMER_VALUE = 0X0E,		//第1路调光
	SECONE_DIMMER_VALUE  = 0X0F,		//第2路调光
	THIRD_DIMMER_VALUE  = 0X10,		//第3路调光
	FOURTH_DIMMER_VALUE  = 0X11,		//第4路调光
	FIVTH_DIMMER_VALUE  = 0X12,		//第5路调光
	SIXTH_DIMMER_VALUE  = 0X13,		//第6路调光
	SEVENTH_DIMMER_VALUE  = 0X14,		//第7路调光
	EIGHTH_DIMMER_VALUE   = 0X15,		//第8路调光

	ONE_FOUR_SCENE = 0X16,		//1-4 场景
	FOUR_EIGHT_SCENE = 0X17,	//4-8 场景
	EIGHT_TWELVE_SCENE = 0X18,		//8-12 场景

	//reserve  0x19 -0x24		//

	FIRST_TIMER_MODE_AND_OPEN = 0X25,	//第一个定时器模式 第一个定时器开启
	FIRST_TIMER_OPEN_HOUR_MINUTE = 0X26, //第一个定时开启时分
	FIRST_TIMER_CLOSE_HOUR_MINUTE = 0X27, //第一个定时开启时分

	SECOND_TIMER_MODE_AND_OPEN = 0X28,	//第一个定时器模式 第一个定时器开启
	SECOND_TIMER_OPEN_HOUR_MINUTE = 0X29, //第一个定时开启时分
	SECOND_TIMER_CLOSE_HOUR_MINUTE = 0X2A, //第一个定时开启时分

	THIRD_TIMER_MODE_AND_OPEN = 0X2B,	//第一个定时器模式 第一个定时器开启
	THIRD_TIMER_OPEN_HOUR_MINUTE = 0X2C, //第一个定时开启时分
	THIRD_TIMER_CLOSE_HOUR_MINUTE = 0X2D, //第一个定时开启时分	

	FOURTH_TIMER_MODE_AND_OPEN = 0X2E,	//第一个定时器模式 第一个定时器开启
	FOURTH_TIMER_OPEN_HOUR_MINUTE = 0X2F, //第一个定时开启时分
	FOURTH_TIMER_CLOSE_HOUR_MINUTE = 0X30, //第一个定时开启时分

	FIVTH_TIMER_MODE_AND_OPEN = 0X31,	//第一个定时器模式 第一个定时器开启
	FIVTH_TIMER_OPEN_HOUR_MINUTE = 0X32, //第一个定时开启时分
	FIVTH_TIMER_CLOSE_HOUR_MINUTE = 0X33, //第一个定时开启时分	

	SIXTH_TIMER_MODE_AND_OPEN = 0X34,	//第一个定时器模式 第一个定时器开启
	SIXTH_TIMER_OPEN_HOUR_MINUTE = 0X35, //第一个定时开启时分
	SIXTH_TIMER_CLOSE_HOUR_MINUTE = 0X36, //第一个定时开启时分

	SEVENTH_TIMER_MODE_AND_OPEN = 0X37,	//第一个定时器模式 第一个定时器开启
	SEVENTH_TIMER_OPEN_HOUR_MINUTE = 0X38, //第一个定时开启时分
	SEVENTH_TIMER_CLOSE_HOUR_MINUTE = 0X39, //第一个定时开启时分

	EIGHTH_TIMER_MODE_AND_OPEN = 0X3A,	//第一个定时器模式 第一个定时器开启
	EIGHTH_TIMER_OPEN_HOUR_MINUTE = 0X3B, //第一个定时开启时分
	EIGHTH_TIMER_CLOSE_HOUR_MINUTE = 0X3C, //第一个定时开启时分	

	NINTH_TIMER_MODE_AND_OPEN = 0X3D,	//第一个定时器模式 第一个定时器开启
	NINTH_TIMER_OPEN_HOUR_MINUTE = 0X3E, //第一个定时开启时分
	NINTH_TIMER_CLOSE_HOUR_MINUTE = 0X3F, //第一个定时开启时分

	TENTH_TIMER_MODE_AND_OPEN = 0X40,	//第一个定时器模式 第一个定时器开启
	TENTH_TIMER_OPEN_HOUR_MINUTE = 0X41, //第一个定时开启时分
	TENTH_TIMER_CLOSE_HOUR_MINUTE = 0X42, //第一个定时开启时分	

	ELEVENTH_TIMER_MODE_AND_OPEN = 0X43,	//第一个定时器模式 第一个定时器开启
	ELEVENTH_TIMER_OPEN_HOUR_MINUTE = 0X44, //第一个定时开启时分
	ELEVENTH_TIMER_CLOSE_HOUR_MINUTE = 0X45, //第一个定时开启时分

	TWELFTH_TIMER_MODE_AND_OPEN = 0X46,	//第一个定时器模式 第一个定时器开启
	TWELFTH_TIMER_OPEN_HOUR_MINUTE = 0X47, //第一个定时开启时分
	TWELFTH_TIMER_CLOSE_HOUR_MINUTE = 0X48, //第一个定时开启时分	

}STRUCT_INPUT_AND_HOLD_DATA_REG_OFFSET_02;
///////////////////////////////////////////////end//////////////////////////////////////

///////////////////////////////////////////////红外接近传感器//////////////////////////////////////
/*地址偏移*/
typedef enum
{
	ALARM_STATES = 0X03,/*报警器状态 :plc 地址 40004 只读*/

}STRUCT_INPUT_AND_HOLD_DATA_REG_OFFSET_03;	
///////////////////////////////////////////////end//////////////////////////////////////

///////////////////////////////////////////////end//////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/*位变量: 迪控调光模块*/
typedef struct
{
	uint32_t allopenorclose:1;//全开/关
	uint32_t systemreset:1;		//系统复位
	uint32_t reloaddefaultparam:1;	//重新自动加载参数	
	uint32_t :25;				//预留1
	uint32_t illuminanceenable:1;//光照度使能
	uint32_t callscenario1:1;	//场景1
	uint32_t callscenario2:1;	//场景2
	uint32_t callscenario3:1;	//场景3
	uint32_t callscenario4:1;	//场景4
	uint32_t callscenario5:1;	//场景5
	uint32_t callscenario6:1;	//场景6
	uint32_t :29;				//预留2
	uint32_t :32;				//预留3
	uint32_t :32;				//预留4

}STRUCT_INPUT_AND_COIL_STATUS_BITS;
/////////////////////////////////////////////////////////////////////////////////////

/*离散量结构体*/
typedef union
{
	uint32_t all[4];//128 bit 
	STRUCT_INPUT_AND_COIL_STATUS_BITS inputandcoilstatusbits;	
}STRUCT_INPUT_AND_COIL_STATUS;


typedef enum
{

	MODBUS_DEVICE_OFFLINE = 0X00,//
	MODBUS_DEVICE_ONLINE = 0X01,	//
	
}STRUCT_MODBUS_DEVICE_ONLINE_STATUS;

/*设备参数信息*/
typedef struct
{
	uint32_t serialbuadrate; /*串口波特率*/
	uint8_t serialinitok;
	uint8_t channelid ;
	uint8_t prototype;
	
	uint8_t moddevid;			//设备地址
	uint8_t moddevusingflag;	//设备使用标记
	
	uint8_t moddevstate;		//设备状态 :离线在线状态

	STRUCT_INPUT_AND_COIL_STATUS inputandcoilstatus;
	uint16_t holdandindatareg[MODBUS_DEVICE_REG_AMOUNT];	//

}STRUCT_MODBUS_DEVICE_INFO;

extern STRUCT_MODBUS_DEVICE_INFO ModbusDevStru;

////////////////////////////////////////外部调用接口///////////////////////////////////
extern uint8_t modbus_device_init(uint8_t ,uint32_t,uint8_t );

extern uint8_t modbus_device_pack_data(uint8_t devid,uint8_t wrtype,uint8_t *datatype, uint32_t startaddr, uint16_t num,uint8_t *sendbuf);
extern uint8_t modbus_device_unpack_data(uint8_t *pdata,uint8_t len,uint8_t devid,uint8_t func, uint32_t startaddr, uint16_t num);
extern uint8_t modbus_device_get_cmd_channel(uint8_t * channel);

int modbus_device_find_index(uint8_t devid);
extern int modbus_device_add(uint8_t devid);
extern int modbus_device_del(uint8_t devid);


//extern int get_modbus_device_Info(int devid,int datatype,int startaddr,int num,int *pvalue);
//extern int set_modbus_device_Info(int devid,int datatype,int startaddr,int num,int *pvalue);
//extern int get_modbus_device_online_status(uint8_t devid);



///////////////////////////////////////////end////////////////////////////////////////////

#endif

